<?php
/**
 * Page gestion des promotions
 * Permet l'affichage, l'ajout, la suppression et la modification des promotions
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class promotionAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des promotions');
	$this->addAriane(shRequest::link('administration'), 'Administration');
	$this->addAriane(shRequest::link('administration', 'filiere'), 'Gestion des filières');
    }

    /**
     * Affichage des promotions
     * @param <integer> Id de la spécialité dont on veut les promotions
     */
    public function execute($id_specialite) {
	// récupération de la spécialité en cours
	if ( !($specialite = shSGBD::selectOne(
	'SELECT filiere.intitule AS filiere, specialite.id AS id, specialite.intitule AS intitule '.
	'FROM specialite '.
	'INNER JOIN filiere ON specialite.id_filiere=filiere.id '.
	'WHERE specialite.id=? '.
	'ORDER BY filiere, intitule',
	array($id_specialite)
	)) ) {
	    throw new Exception ('La spécialité demandée n\'existe pas');
	}

	$this->setTitle('Promotions de ' . $specialite->filiere . ' - ' . $specialite->intitule);

	// Récupération des promotions de la spécialité
	$promotions = shSGBD::select(
		'SELECT DISTINCT id, date_debut, date_fin, visible '.
		'FROM promotion '.
		'INNER JOIN responsable ON promotion.id=responsable.id_promotion '.
		'WHERE promotion.id_specialite=? '.
		'AND responsable.id_user=? '.
		'ORDER BY date_debut DESC',
		array($specialite->id,shSession::__instance()->getId())
	);

	// Récupère les enseignements de chaque promotion pour lesquels il y a des groupes
	foreach ( $promotions AS &$promotion ) {
	    $promotion->enseignements = shSGBD::select(
		    'SELECT DISTINCT enseignement.id, ue.intitule AS ue, type_enseignement.intitule AS type_enseignement, '.
		    'ue.id AS ueId '.
		    'FROM enseignement '.
		    'INNER JOIN groupe ON enseignement.id=groupe.id_enseignement AND groupe.id_promotion=:id_promotion '.
		    'INNER JOIN type_enseignement ON enseignement.id_type_enseignement=type_enseignement.id '.
		    'INNER JOIN ue ON enseignement.id_ue=ue.id '.
		    'ORDER BY ue',
		    array(':id_promotion' => $promotion->id )
	    );

	    // Récupère les groupes de ces enseignements pour la promotion
	    foreach ( $promotion->enseignements AS &$enseignement ) {
		$enseignement->groupes = shSGBD::select(
			'SELECT DISTINCT id, intitule '.
			'FROM groupe '.
			'WHERE id_enseignement=:id_enseignement '.
			'AND id_promotion=:id_promotion '.
			'ORDER BY intitule ',
			array(':id_promotion' => $promotion->id, ':id_enseignement' => $enseignement->id )
		);
	    }
	}

	$this->assign('specialite', $specialite);
	$this->assign('promotions', $promotions);
    }

    /**
     * Modification d'une promotion
     * @param $id_promotion l'identifiant de la promotion à modifier
     */
    public function executeEdit($id_promotion) {
	$this->setTitle('Modification d\'une promotion');

	// On récupère la promotion
	$promotion = shSGBD::selectOne('SELECT id,visible,id_specialite,date_debut,date_fin FROM promotion WHERE id=?'
		,array($id_promotion));

	if (!$promotion) {
	    throw new Exception('La promotion demandée n\'existe pas');
	    return false;
	}

	// On récupère toutes les UE
	$ues = shSGBD::select('SELECT id,intitule FROM ue ORDER BY intitule ASC');

	// On récupère les ues qu'on a selectionné
	$assister = shSGBD::select('SELECT id_ue FROM assister WHERE id_promotion=?',array($id_promotion));

	// On récupère la liste des users
	$users = shSGBD::select('SELECT id,identifiant FROM user ORDER BY identifiant ASC');

	// On récupère la liste des users responsable
	$responsables = shSGBD::select('SELECT id_user FROM responsable WHERE id_promotion=?',array($id_promotion));

	// fil d'ariane
	$this->addAriane(shRequest::link('administration', 'promotion',null,$promotion->id_specialite), 'Gestion des promotions');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Modifier cette promotion');

	// Intitulé de la salle
	shField::checkbox('Visible')
		->setValue($promotion->visible)
		->appendTo($formulaire);

	shField::date('Date de début')
		->setValue(Date::fromSGBD($promotion->date_debut)->toFormulaire())
		->appendTo($formulaire);

	shField::date('Date de fin')
		->setValue(Date::fromSGBD($promotion->date_fin)->toFormulaire())
		->appendTo($formulaire);

	$select = shField::select('Spécialité')
		->setValue($promotion->id_specialite)
		->appendTo($formulaire);

	// On rempli le select
	$specialites = shSGBD::select('SELECT id,intitule FROM specialite ORDER BY intitule ASC');
	foreach ($specialites as $specialite) {
	    $select->addOption($specialite->id,$specialite->intitule);
	}

	// On s'occupe du multi select pour les Ues
	$multiSelect = shField::multibox('Ue(s) liée(s)')
		->setRequired(false)
		->appendTo($formulaire);
	$idUes = array();
	foreach ($ues as $ue) {
	    $multiSelect->addOption($ue->id,$ue->intitule);
	}

	foreach ($assister as $assist){
	    $idUes[] = $assist->id_ue;
	}
	$multiSelect->setValue($idUes);

	// On s'occupe du multi select des responsables
	$multiSelectResponsable = shField::multibox('Enseignant(s) Responsable(s)')
	    ->appendTo($formulaire);
	foreach ($users as $user){
	    $multiSelectResponsable->addOption($user->id,$user->identifiant);
	}
	$idUsers = array();
	foreach($responsables as $responsable){
	    $idUsers[] = $responsable->id_user;
	}
	$multiSelectResponsable->setValue($idUsers);

	$formulaire->setSubmit(function($formulaire) use ($promotion,$responsables) {
		    // On modifie la promotion
		    shSGBD::update(
			    'UPDATE promotion SET visible=:visible,id_specialite=:specialite, date_debut=:date_debut, date_fin=:date_fin '.
			    'WHERE id=:id_promotion',
			    array(
			    ':visible' => $formulaire->getField('Visible')->getValue(),
			    ':specialite' => $formulaire->getField('Spécialité')->getValue(),
			    ':date_debut' => Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
			    ':date_fin' => Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD(),
			    ':id_promotion' => $promotion->id)
		    );

		    // On met a jour les responsables
		   
		    // On ajoute si besoin
		    print_r('ajout si besoin');
		    foreach ($formulaire->getField('Enseignant(s) Responsable(s)')->getValue() AS $user ) {
			$flag = false;
			foreach($responsables as $responsable){
			    if ($user == $responsable->id_user){
				print_r('changement flag');
				$flag = true;
			    }
			}
			if ($flag == false){
				shSGBD::insert('INSERT INTO responsable(id_user,id_promotion,responsable) '.
					'VALUES (?,?,1)',array($user,$promotion->id));
			}
		    }

		    // On récupère la table modifiée
		    $responsables = shSGBD::select('SELECT id_user FROM responsable WHERE id_promotion=?',array($promotion->id));

		    // On retire si besoin
		    foreach($responsables as $responsable){
			$flag = false;
			foreach ($formulaire->getField('Enseignant(s) Responsable(s)')->getValue() AS $user ) {
			    print_r($user .'==' .$responsable->id_user);
			    if ($user == $responsable->id_user){
				print_r('changement flag');
				$flag = true;
			    }
			}
			if ($flag == false){
			    shSGBD::delete('DELETE FROM responsable WHERE id_user=? AND id_promotion=?'
				    ,
				    array($responsable->id_user,$promotion->id));
			}
		    }
		    //	Ensuite on
		    //	    -	Ajoute les nouvelles UE
		    //	    -	On touche pas a celle qui reste
		    //	    -	On retire celle qui ne sont plus liées

		    // Pour ça on récupère celle qu'on a déja
		    $assister = shSGBD::select('SELECT id_ue FROM assister WHERE id_promotion=?', array($promotion->id));

		    // On commence par l'ajout
		    foreach ($formulaire->getField('Ue(s) liée(s)')->getValue() AS $ue ) {
			$flag = false;
			foreach ($assister as $assist) {
			    if ($ue == $assist->id_ue) {
				$flag = true;
			    }
			}
			if ($flag == false) {
			    shSGBD::insert(
				    'INSERT INTO assister(id_promotion, id_ue) '.
				    'VALUES(:id_promotion, :id_ue) ',
				    array(':id_promotion' => $promotion->id, ':id_ue' => $ue));
			}
		    }
		    // On actualise en fonction de la base
		    $assister = shSGBD::select('SELECT id_ue FROM assister WHERE id_promotion=?', array($promotion->id));
		    
		    // On fini par la suppression
		    foreach ($assister as $assist) {
			$flag = false;
			foreach ($formulaire->getField('Ue(s) liée(s)')->getValue() AS $ue ) {
			    if ($ue == $assist->id_ue) {
				$flag = true;
			    }
			}
			if ($flag == false) {
			    // Suppresion des données de la table assister
			    shSGBD::delete('DELETE FROM assister where id_ue=?', array($assist->id_ue));

			    // Suppresion des données de la table enseigner
			    shSGBD::delete('DELETE FROM enseigner where id_ue=?', array($assist->id_ue));

			    // On récupere tous les enseignements qui seront impactés par l'effacement
			    $enseignements = shSGBD::select('SELECT id FROM enseignement WHERE id_ue=?', array($assist->id_ue));
			    if (!empty($enseignements)) {
				$idEnseign = array();
				foreach ($enseignements as $enseignement) {
				    $idEnseign[] = $enseignement->id;
				}

				//  On a besoin des enseignements dans groupe et séance
				//  On les recupèrent avant de les effacer
				//	Partie Groupe
				$groupes = shSGBD::select('SELECT id FROM groupe '.
					'WHERE id_enseignement IN (?'.str_repeat(',? ', sizeof($idEnseign) - 1).') ',$idEnseign);
				// Pour chaque groupe on execute le delete propre au groupe
				foreach ($groupes as $groupe) {
				    shAction::call('groupe','delete',array($groupe->id));
				}

				// Partie Seance
				$seances = shSGBD::select('SELECT id FROM seance '.
					'WHERE id_enseignement IN (?'.str_repeat(',? ', sizeof($idEnseign) - 1).') ',$idEnseign);

				if (!empty($seances)) {
				    $idSeances = array();
				    foreach ($seances as $seance) {
					$idSeances[] = $seance->id;
				    }
				    //	+   On supprime toutes traces des séances dans mutualiser et participer
				    //	+   On supprime toutes les séances
				    shSGBD::delete('DELETE FROM mutualiser WHERE id_seance IN (?'.str_repeat(',? ', sizeof($idSeances) - 1).') ',$idSeances);
				    shSGBD::delete('DELETE FROM participer WHERE id_seance IN (?'.str_repeat(',? ', sizeof($idSeances) - 1).') ',$idSeances);
				    shSGBD::delete('DELETE FROM seance WHERE id IN (?'.str_repeat(',? ', sizeof($idSeances) - 1).') ',$idSeances);
				}
			    }

			    //  -	On termine cette partie par la suppression des enseignements
			    shSGBD::delete('DELETE FROM enseignement WHERE id_ue=?', array($assist->id_ue));

			}
		    }

    		    shAction::redirect('administration','promotion',null,array($formulaire->getField('Spécialité')->getValue()));
		})
	;

	$this->assign('formulaire', $formulaire);
    }

    /**
     * Création d'une promotion
     */
    public function executeCreate($_id_specialite) {

	// fil d'ariane
	$this->addAriane(shRequest::link('administration', 'promotion',null,$_id_specialite), 'Gestion des promotions');

	$this->setTitle('Création d\'une promotion');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Créer cette promotion');

	// On récupère la spécialité
	$spe = shSGBD::selectOne('SELECT id,id_filiere FROM specialite WHERE id=?', array($_id_specialite));
	// On récupère les spécialités de la même filière que celle passée en paramètre
	$specialites = shSGBD::select('SELECT id,intitule FROM specialite '.
		'WHERE id_filiere=? '.
		'ORDER BY intitule ASC'
		,array($spe->id_filiere));
	// On récupère toutes les UE
	$ues = shSGBD::select('SELECT id,intitule FROM ue ORDER BY intitule ASC');
	// On récupère la liste des enseignants
	$users = shSGBD::select('SELECT id,identifiant FROM user ORDER BY identifiant ASC');

	// Déclaration des champs
	shField::checkbox('Visible')->appendTo($formulaire);
	shField::date('Date de début')->appendTo($formulaire);
	shField::date('Date de fin')->appendTo($formulaire);
	$select = shField::select('Spécialité')
		->setValue($_id_specialite)
		->appendTo($formulaire);

	// On rempli le select des specialites
	foreach ($specialites as $specialite) {
	    $select->addOption($specialite->id,$specialite->intitule);
	}

	// On s'occupe du multi select des Ues
	$multiSelect = shField::multibox('Ue(s) liée(s)')
		->setRequired(false)
		->appendTo($formulaire);
	$idUes = array();
	foreach ($ues as $ue) {
	    $multiSelect->addOption($ue->id,$ue->intitule);
	}

	// On s'occupe du multi select des responsables
	$multiSelectResponsable = shField::multibox('Enseignant(s) Responsable(s)')
	    ->appendTo($formulaire);
	foreach ($users as $user){
	    $multiSelectResponsable->addOption($user->id,$user->identifiant);
	}
	$multiSelectResponsable->setValue(array(shSession::__instance()->getId()));

	$formulaire->setSubmit(function($formulaire) use ($spe) {
		    // On Crée la promotion
		    $idPromotion = shSGBD::insert(
			    'INSERT INTO promotion(visible,id_specialite,date_debut,date_fin) '.
			    'VALUES (:visible,:specialite,:date_debut,:date_fin) ',
			    array(
			    ':visible' => $formulaire->getField('Visible')->getValue(),
			    ':specialite' => $formulaire->getField('Spécialité')->getValue(),
			    ':date_debut' => Date::fromFormulaire($formulaire->getField('Date de début')->getValue())->toSGBD(),
			    ':date_fin' => Date::fromFormulaire($formulaire->getField('Date de fin')->getValue())->toSGBD())
		    );
		    // On lie les promotions aux ues choisies
		    // Insertion
		    foreach ( $formulaire->getField('Ue(s) liée(s)')->getValue() AS $ue ) {
			shSGBD::insert(
				'INSERT INTO assister(id_promotion, id_ue) '.
				'VALUES(:id_promotion, :id_ue) ',
				array(':id_promotion' => $idPromotion, ':id_ue' => $ue)
			);
		    }
		    // On lie les users en tant que responsables
		    foreach ( $formulaire->getField('Enseignant(s) Responsable(s)')->getValue() AS $user ) {
			shSGBD::insert('INSERT INTO responsable(id_user,id_promotion,responsable) VALUES(?,?,1)'
				,array($user,$idPromotion));
		    }

		    shAction::redirect('administration','promotion',null,array($formulaire->getField('Spécialité')->getValue()));
		})
	;

	$this->assign('formulaire', $formulaire);
    }

    /**
     * Efface la promotion
     * @param <type> $_id_promotion L'identifiant de la promotion à effacer
     */
    public function executeDelete($_id_promotion) {

	// Supprimer une promotion à un impact sur les tables
	// Promotion
	//	-	responsable
	//	-	assister
	//	-	groupe
	//	-	jours_desactives_promotion
	//	-	mutualiser

	// On récupère la promotion
	$promotion = shSGBD::selectOne('SELECT id_specialite FROM promotion WHERE id=?',array($_id_promotion));

	shSGBD::delete('DELETE FROM responsable WHERE id_promotion=?',array($_id_promotion));
	shSGBD::delete('DELETE FROM assister WHERE id_promotion=?',array($_id_promotion));
	shSGBD::delete('DELETE FROM jours_desactives_promotion WHERE id_promotion=?',array($_id_promotion));

	// On récupère les groupes de la promotion et on les efface
	$groupes = shSGBD::select('SELECT id FROM groupe WHERE id_promotion=?',array($_id_promotion));
	foreach ($groupes as $groupe) {
	    $this->call('groupe','delete',array($groupe->id));
	}

	// On termine par la suppression de la promotion
	shSGBD::delete('DELETE FROM promotion where id=?',array($_id_promotion));

	shAction::redirect('administration','promotion',null,$promotion->id_specialite);
    }
}
?>